const { environment } = require('./environment.js')
import { ACCESS_TOKEN } from '@/store/mutation-types'
import storage from '@/utils/storage';

// 此vm参数为页面的实例，可以通过它引用vuex中的变量
module.exports = (vm) => {
  // 初始化请求配置
  uni.$u.http.setConfig((config) => {
    /* config 为默认全局配置，请求地址判断*/
	  /* #ifdef H5 */
	  if (process.env.NODE_ENV === 'production') {
		  config.baseURL = environment.baseURL; /* 根域名 */
	  } else {
      // 开发模式则使用代理方式，见vue.config.js配置
		  config.baseURL = '/'; /* 根域名 */
	  }
	  /* #endif */
	  /* #ifndef H5 */
	  config.baseURL = environment.baseURL; /* 根域名 */
	  /* #endif */
    return config
  })

  // 请求拦截
  uni.$u.http.interceptors.request.use((config) => { // 可使用async await 做异步操作
		// console.log(config)
		// if (config.url.includes('auth')) {
		// 	config.custom = {
		// 		auth: true
		// 	}
		// }
		// if (config.url.includes('/api')) {
		// 	config.custom = {
		// 		auth: true,
		// 		loading: true
		// 	}
		// }
		config.custom = {
			auth: true,
			loading: true
		}
		// 初始化请求拦截器时，会执行此方法，此时data为undefined，赋予默认{}
    config.data = config.data || {}
    // 根据custom参数中配置的是否需要token，添加对应的请求头
    if(config?.custom?.auth) {
      // 可以在此通过vm引用vuex中的变量，具体值在vm.$store.state中
      config.header.Authorization = storage.get(ACCESS_TOKEN)
    }
    // 根据custom参数中配置的是否需要显示loading
    if (config?.custom?.loading) {
      uni.showLoading({
        title: '加载中...',
        mask: true
      })
    }
    return config 
  }, config => { // 可使用async await 做异步操作
    return Promise.reject(config)
  })
	
	// 响应拦截
  uni.$u.http.interceptors.response.use((response) => {
    const data = response.data
    // 关闭loading
    uni.hideLoading()
    return data === undefined ? {} : data
  }, (response) => { 
		uni.hideLoading()
		// if (response.statusCode === 401) {
		// 	uni.$u.toast('您的身份已过期，请重新登录。系统将在 3 秒后自动跳转到登录页。')
		// 	setTimeout(() => {
		// 		uni.reLaunch({
		// 			url: '/'
		// 		});
		// 	}, 3000)
		// } else if (response.statusCode === 500) {
		// 	uni.$u.toast('服务器错误，请联系管理员')
		// } else if (response.statusCode === 400) {
		// 	uni.$u.toast(response.data.message)
		// } else {
		// 	uni.$u.toast('未知错误, 请求失败')
		// }
		switch(response.statusCode) {
			case 401:
				uni.$u.toast('您的身份已过期，请重新登录。系统将在 3 秒后自动跳转到登录页。')
				setTimeout(() => {
					uni.reLaunch({
						url: '/'
					});
				}, 3000)
				break;
			case 500:
				uni.$u.toast('服务器错误，请联系管理员')
				break;
			case 400:
				uni.$u.toast(response.data.message)
				break;
			default:
				break; uni.$u.toast('未知错误, 请求失败')
		}
    return Promise.reject(response)
  })
}